#include "types.h"
#include <QPointF>
#include <QPushButton>
#include <cmath>
#include <QDebug>
#include <QSettings>

bool ValidQReal(qreal value)
{
    if (value != value){
        return false;
    }
    else if (value > std::numeric_limits<qreal>::max()){
        return false;
    }
    else if (value < -std::numeric_limits<qreal>::max()){
        return false;
    }
    else
        return true;
}

int plusModulo(int a, int b, int mod)
{
    int sum = a + b;
    while (sum >= mod)
        sum -= mod;
    return sum;
}

int minusModulo(int a, int b, int mod)
{
    int result = a - b;
    while (result < 0)
        result += mod;
    return result;
}

double normalizeAngle(double angle)
{
    while (angle < 0)
        angle += TwoPi;
    while (angle > TwoPi)
        angle -= TwoPi;
    return angle;
}

double normalizeDegAngle(double angle)
{
    while (angle < 0)
        angle += 360;
    while (angle >= 360)
        angle -= 360;
    return angle;
}

/**
  Funkcja przesuwa dwa punkty w kierunku prostopadłym do prostej
  P1P2 o odległość d. (dodatnie w prawo, ujemne w lewo).
  \todo Można ją uprościć, stosując funkcję składową klasy QLineF, która zwraca odcinek prostopadły.
  */
void movePoints(QPointF *P1, QPointF *P2, double d)
{
    double x1 = P1->x(), x2 = P2->x(), y1 = P1->y(), y2 = P2->y(); // dane
    double x3, x4, y3, y4; // szukane
    double L = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));

    double dx = d/L * (y1-y2); //x4-x2 = x3-x1
    double dy = -d/L * (x1-x2); //y4-y2 = y3-y1

    x3 = dx + x1;
    x4 = dx + x2;
    y3 = dy + y1;
    y4 = dy + y2;

    P1->setX(x3);
    P1->setY(y3);
    P2->setX(x4);
    P2->setY(y4);
    return;
}
/** Magiczny wzorek matematyczny. Sprawdza, czy punkt C leży na przecięciu punktów A i B.
    Szybszy od qt'owego, który liczy kolizje ścieżek (QPainterPath)
    \relatesalso Car
 */
bool CCW(QPointF A, QPointF B, QPointF C)
{
    return ((C.y()-A.y())*(B.x()-A.x()) > (B.y()-A.y())*(C.x()-A.x()));
}

void changeButtonTextColor(QPushButton *but, QColor color)
{
    QPalette palette = but->palette();
    palette.setBrush(QPalette::ButtonText, QBrush(color, Qt::SolidPattern)); // zmiana na czerwony
    but->setPalette(palette);
}

void removeGroupSettings(QString nazwa)
{
    QSettings opcje("TabMar", "RoundaboutSimulator");
    opcje.beginReadArray(nazwa);
    opcje.remove("");
    opcje.endArray();
}

void debug(QString s)
{
    if (DEBUG)
        qDebug() << QObject::tr(s.toAscii());
}
